package com.cq.androidtools.view

import android.annotation.SuppressLint
import android.content.Context
import android.text.Editable
import android.text.TextWatcher
import android.util.AttributeSet
import android.widget.EditText

/**
 * 作者: CQ
 * 日期: 2021-08-19
 * 说明:
 */
@SuppressLint("AppCompatCustomView")
class InputMoneyEditText(context: Context?, attrs: AttributeSet?) : EditText(context, attrs) {

    private var onInputListener: OnInputListener? = null

    fun addChangedInputTextListener(onInputListener: OnInputListener) {
        addTextChangedListener(textWatcher)
        textLast = text.toString()
        this.onInputListener = onInputListener
    }

    private var onChangedText: (Double) -> Unit = {}

    fun addChangedInputTextListener(onChangedText: (Double) -> Unit) {
        addTextChangedListener(textWatcher)
        textLast = text.toString()
        this.onChangedText = onChangedText
    }

    private var textLast = ""

    private var textWatcher = object : TextWatcher {
        override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
        }

        override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
        }

        override fun afterTextChanged(p0: Editable?) {
            var inputText = p0.toString()
            if (inputText == "") { // 全部为空，默认输入为0
                inputText = "0"
                onChanged(inputText, 1)
            } else if (inputText.startsWith(".")) { // 删除小数点前面所有的值或在第一位输入小数点(1.0变成.0或者是1变成.1，自动补充整数位0)
                inputText = "0$inputText" // 默认补充点前面的0，组成正常的小数
                if (textLast.indexOf(".") == 1) { // 上一次输入的值有小数点，说明是删除小数点前面所有的值
                    onChanged(inputText, 1)
                } else { // 第一位输入小数点
                    onChanged(inputText, 2)
                }
            } else if (inputText.contains(".")) { // 小数计算整数位0
                val strs = inputText.split(".")  // 分割整数位和小数位数据
                if (strs[0].toInt().toString() != strs[0]) {  // 如果整数位开头包括0，转正常数值（100.1变成00.1或者0.1变成00.1）
                    inputText = "${strs[0].toInt()}.${strs[1]}"
                    if (textLast.split(".")[0].toInt() == 0) { // 上一次输入的值有小数点，说明是删除小数点前面的值
                        onChanged(inputText, 1)
                    } else {
                        onChanged(inputText, 0)
                    }
                }
            } else { // 整数计算整数位0
                if (inputText.toInt().toString() != inputText) { // （100变成00，0变08）
                    inputText = inputText.toInt().toString()
                    if (textLast.toInt() == 0) {
                        onChanged(inputText, 1)
                    } else {
                        onChanged(inputText, 0)
                    }
                }
            }
            textLast = inputText
            onChangedText(inputText.toDouble())
            onInputListener?.onChanged(inputText.toDouble())
        }
    }

    private fun onChanged(text: String, pos: Int) {
        removeTextChangedListener(textWatcher)
        setText(text)
        if (pos == -1) {
            setSelection(text.length)
        } else {
            setSelection(pos)
        }
        addTextChangedListener(textWatcher)
    }

    override fun addTextChangedListener(watcher: TextWatcher?) {
        isHasTextChangedListener = true
        super.addTextChangedListener(watcher)
    }

    override fun removeTextChangedListener(watcher: TextWatcher?) {
        isHasTextChangedListener = false
        super.removeTextChangedListener(watcher)
    }

    var isHasTextChangedListener = false

    /**
     * 数据变化后不产生监听变化，
     * 取消监听 -> 修改值 -> 增加监听
     */
    fun setTextNoChanged(text: String) {
        var isHas = false
        if (isHasTextChangedListener) {
            isHas = true
            removeTextChangedListener(textWatcher)
        }
        if (text == null) {
            setText("")
        } else {
            setText(text)
        }
        if (isHas) {
            addTextChangedListener(textWatcher)
        }
    }

}

interface OnInputListener {
    fun onChanged(value: Double)
}